import json,time,urllib.parse,urllib.request,requests

from core import info_collection
from confs import settings
from gevent import monkey
from plugins.windows_collection import Win32Info

# monkey.patch_all(thread=False,select=False)

class ArgvHandler (object):
    def __init__ (self,args):
        self.args = args 
        self.parse_args ()
        
    def parse_args (self):
        """
        分析参数，如果有参数指定的方法，则执行该功能，如果没有，打印帮助说明。
        :return:
        """
        if len (self.args) > 1 and hasattr (self,self.args [1]):
            func = getattr (self,self.args[1])
            func () # 获取方法，后面加括号可以将这个方法运行。
            
        else:
            self.help_msg ()
            
    # sys.argv:获取命令行外部参数，返回值是List，第一个元素是程序本身
    # python main.py collect_data
    # args[0]:main.py 
    # args[1]:collect_data
            
    # hasattr函数 判断一个对象是否具有属性或方法
    # getattr函数 获取对象object的属性或者方法
            
    @staticmethod 
    def collect_data ():
        """收集硬件信息,用于测试！"""
        start_time = time.time()
        info = info_collection.InfoCollection()
        asset_data = info.collect()
        print (asset_data)
        print (len (asset_data))
        
        # from plugins.test import Win32Info
        # asset_data = Win32Info('172.25.1.105').collect ()
        # print (asset_data)
        
        
        
    @staticmethod
    def report_data ():
        """
        收集硬件信息，然后发送到服务器。
        :return:
        """
        # 收集信息
        from plugins.windows_collection import Win32Info
        info = info_collection.InfoCollection()
        asset_data = info.collect()
        # print (asset_data)
        print(len(asset_data))
        
        # from plugins.test import Win32Info
        # asset_data = Win32Info('172.25.1.105').collect () 
        # print (asset_data)
        
        # 将数据打包到一个字典内，并转换为json格式
        data = {'asset_data':json.dumps (asset_data)}
   
        # 根据settings中的配置，构造url
        url = "http://%s:%s%s" % (settings.Params['server'],settings.Params['port'],settings.Params['url'])
        print ('正在将数据发送至： [%s]  ......' % url)
        
        try:
            # 使用Python内置的urllib.request库，发送post请求。
            # 使用urlencode这个方法将字典序列化成字符串，encode()并编码成bytes类型
            # data_encode = urllib.parse.urlencode (all_data).encode()
            # response = urllib.request.urlopen (url = url,data = data_encode,timeout = settings.Params ['request_timeout'])
            # message = response.encode ('utf-8')
            
            response = requests.post (url = url,data = data)
            message = response
           
            print ("\033[31;1m发送完毕！\033[0m ")
            print ("返回结果：%s" % message)
        except Exception as e:
            message = '发送失败' + "   错误原因：  {}".format(e)
            print ("\033[31;1m发送失败，错误原因： %s\033[0m" % e)
        # 记录发送日志
        with open (settings.PATH,'ab') as f: # 以byte的方式写入，防止出现编码错误
            log = '发送时间：%s \t 服务器地址：%s \t 返回结果：%s \n' % (time.strftime('%Y-%m-%d %H:%M:%S'), url, message)
            f.write(log.encode())
            print("日志记录成功！")

    @staticmethod
    def help_msg():
        print ("python main.py collect_data or python main.py report_data")

    
